#include <stdio.h>
#include <stdlib.h>

//队列结构
typedef struct 
{
    int *data;//动态数组存储队列元素
    size_t size;//队列内的元素个数
    size_t capacity;//动态数组的容量
    size_t front;//队列头指针
    size_t rear;//队列尾指针
} Queue;

//初始化队列内元素个数
void initQueue(Queue *queue, size_t capacity){
    queue->data = (int*)malloc(capacity*sizeof(int));//分配初始内存的容量
    queue->size = 0;//初始元素个数为0‘
    queue->capacity = capacity;//设置容量
    queue->front = 0;//队列头指针
    queue->rear = 0;//队列尾指针
}

//返回队列内元素个数
size_t getSize(const Queue *queue){
    return queue->size;
}

//添加新元素
void enqueue(Queue *queue, int element){
    if(queue->size == queue->capacity){
        printf("队列已满，添加失败\n");
        return;
    }
    queue->data[queue->rear] = element;//将元素添加到队列尾部
    queue->rear = (queue->rear+1)%queue->capacity;//循环更新队列尾指针
    queue->size++;//更新元素个数
}

//元素出队栈
int dequeue(Queue *queue){
    if(queue->size == 0){
        return -1;//队列为空，返回无效值
    }
    int dequeuedElement = queue->data[queue->front];//获取队列头部元素
    queue->front = (queue->front + 1)%queue->capacity;//循环更性队列头指针
    queue->size--;//更新元素个数
    return dequeuedElement;//返回出队的元素
}

//释放队列元素
void destroyQueue(Queue *queue){
    free(queue->data);//释放动态数组内存
    queue->data = NULL;
    queue->size = 0;
    queue->capacity = 0;
    queue->front = 0;
    queue->rear = 0;
}

//遍历元素
void printQueue(Queue *queue){
    for(int i = queue->front,j = 0;j < queue->size;i++,j++){
        int data = queue->data[i % queue->capacity];
        printf("%d ",data);
    }
    printf("\n");
}

int main(){
    Queue myQueue;
    //初始化队列
    initQueue(&myQueue,2);
    printf("初始化队列，初始容量为2\n");
    //入队元素
    enqueue(&myQueue,1);
    enqueue(&myQueue,2);
    printf("队列内元素个数：%zu\n",getSize(&myQueue));
    //出队元素
    printf("出队元素：%d\n",dequeue(&myQueue));
    //释放队列内存
    destroyQueue(&myQueue);
    printf("队列内存以释放\n");
    return 0;
}